/* 
 * File:   complexArrayVectorProduct.c
 * Author: pablo
 *
 * Created on 18 de agosto de 2011, 07:44 PM
 */

#include "mex.h"

/* The computational routine */
void complexArrayVectorProduct(double *realM, double *imM, double *realV , double *imV, double *realSalida, double *imSalida, mwSize m, mwSize n) {
/* Tomo una matriz MxN y un vector columna de largo M  y calculo el producto elemento a elemento entre vector y columnas*/
    /*salida es 1xn*/
int i;
int j;
for(i=0;i<n;i++){
    for(j=0;j<m;j++){
        realSalida[m*i+ j]   =   realM[m*i+j]*realV[j] - imM[m*i+j]*imV[j];
        imSalida[m*i+j]     =   realM[m*i+j]*imV[j] + imM[m*i+j]*realV[j]; 
    }
}
}

/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
    /* nrhs es el número de inputs desde matlab, *prhs es el puntero a una estructura que los contiene*/
    /* nlhs es el número de salidas y *plhs es el puntero a la estructura que los contendrá*/
    
    double *in1Real;               /* MxN input matrix (fila) */
    double *in1Im;               /* MxN input matrix (fila) */
    double *in2Real;               /* MxN input matrix (fila) */
    double *in2Im;               /* MxN input matrix (fila) */
    mwSize M;                   /* size of matrix */
    mwSize N;                   /* size of matrix */
    double *outMatrixReal;              /* MxN output matrix */
    double *outMatrixIm;              /* MxN output matrix */
    
     /* check for proper number of arguments */
    if(nrhs!=2) {
        mexErrMsgIdAndTxt("MyToolbox:complexArrayVectorProduct:nrhs","Two inputs required.");
    }
    if(nlhs!=1) {
        mexErrMsgIdAndTxt("MyToolbox:complexArrayVectorProduct:nlhs","One output required.");
    }
    /* check that size of both arguments is congruent */
    if(mxGetM(prhs[0])!=mxGetM(prhs[1])) {
        mexErrMsgIdAndTxt("MyToolbox:complexArrayVectorProduct:notEqualSize","Inputs must be equal in length.");
    }
    if(mxGetN(prhs[1])!=1) {
        mexErrMsgIdAndTxt("MyToolbox:complexArrayVectorProduct:notEqualSize","Second input must be column vector.");
    }


    /* inputs */
    M = mxGetM(prhs[0]);
    N = mxGetN(prhs[0]);
    in1Real = mxGetPr(prhs[0]);
    if (mxIsComplex(prhs[0])){
        in1Im = mxGetPi(prhs[0]);
    }else{
        in1Im=mxGetPi(mxCreateDoubleMatrix(M,N,mxCOMPLEX));
    }
    in2Real = mxGetPr(prhs[1]);
    if (mxIsComplex(prhs[1])){
        in2Im = mxGetPi(prhs[1]);
    }else{
        in2Im=mxGetPi(mxCreateDoubleMatrix(M,1,mxREAL));
    }

    /* create the output matrix */
    plhs[0] = mxCreateDoubleMatrix(M,N,mxCOMPLEX);

    /* get a pointer to the real data in the output matrix */
    outMatrixReal = mxGetPr(plhs[0]);
    outMatrixIm = mxGetPi(plhs[0]);

    /* call the computational routine */
    complexArrayVectorProduct(in1Real, in1Im, in2Real, in2Im, outMatrixReal, outMatrixIm, M ,N);
}

